package cn.jiaqiang.chatgpt.data.domain.weixin.service.message;

import cn.jiaqiang.chatgpt.data.domain.openai.repository.IUserAccountRepository;
import cn.jiaqiang.chatgpt.data.domain.openai.model.entity.UserAccountEntity;
import cn.jiaqiang.chatgpt.data.domain.weixin.model.entity.MessageTextEntity;
import cn.jiaqiang.chatgpt.data.domain.weixin.model.entity.UserBehaviorMessageEntity;
import cn.jiaqiang.chatgpt.data.domain.weixin.repository.IWeiXinRepository;
import cn.jiaqiang.chatgpt.data.domain.weixin.service.IBehaviorMessageService;
import cn.jiaqiang.chatgpt.data.types.sdk.weixin.XmlUtil;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;

import javax.annotation.Resource;

import static cn.jiaqiang.chatgpt.data.types.common.RedisConstants.OPENAI_CODE_EXPIRED;

/**
 * User: jia-qiang
 * Date: 2024-04-09
 * Time: 17:16
 */
@Slf4j
@Service
public class BehaviorMessageDefaultService implements IBehaviorMessageService {

    @Value("${wx.config.originalid}")
    private String originalId;

    @Resource
    protected IUserAccountRepository userRepository;

    @Resource
    private IWeiXinRepository weiXinRepository;

    @Override
    public String doBehaviorMessage(UserBehaviorMessageEntity userBehaviorMessageEntity) {

        String openId = userBehaviorMessageEntity.getOpenId();
        // 此时的 content 被认为时 userID
        String userId = userBehaviorMessageEntity.getContent();

        log.error("userId: {}", userId);
        MessageTextEntity res = new MessageTextEntity();
        res.setToUserName(userBehaviorMessageEntity.getOpenId());
        res.setFromUserName(originalId);
        res.setCreateTime(String.valueOf(System.currentTimeMillis() / 1000L));
        res.setMsgType("text");
        // 老用户转移
        // 先判断 userId 是否有效
        UserAccountEntity userAccountEntity = userRepository.queryUserByUserId(userId);
        if (userAccountEntity == null) {
            // userId 有误
            res.setContent("获取校验码 - 若是新用户请发送【401】, 若已有账号请发送【有效的用户ID】");
            return XmlUtil.beanToXml(res);
        }
        // 判断用户发来的openId和数据库中的是否一致
        if (!userAccountEntity.getOpenid().equals(openId)) {
            // 不一致, 需要进行迁移, 更新用户的openId
            log.info("用户userId: {} 进行账户迁移", userAccountEntity.getUserId());
            userRepository.updateUserOpenIdWithUserId(openId, userId);
        }
        // 生成验证码
        String code = weiXinRepository.generateCode(userAccountEntity.getUserId().toString(), userBehaviorMessageEntity.getOpenId());
        // 反馈信息[文本]
        res.setContent(String.format("账号唯一ID: %s  验证码: %s 验证码有效期为%s分钟, 请尽快登录.请勿转发!",
                userId, code, OPENAI_CODE_EXPIRED));
        return XmlUtil.beanToXml(res);
    }
}
